
package org.persistente.manipula.mapeamento;

import org.persistente.manipula.conexao.ConexaoBD;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;


public class ManipuladorGeneratedKeys<T> extends Manipulador<T> {

    public ManipuladorGeneratedKeys(MapaObjetoRelacional mapa) {
        super(mapa);
    }

    public ManipuladorGeneratedKeys(MapaObjetoRelacional mapa, Connection con) {
        super(mapa, con);
    }    


    @Override
    public void insereRetornando(T entidade) {
        List<CampoAbstrato> chaves = getChaves();
        if(chaves.size() != 1 || !(chaves.get(0) instanceof CampoInteger)){
            throw new ManipulaException("M�todo n�o permitido para esta entidade");
        }

        Connection con = getConexao();
        PreparedStatement st = null;
        ResultSet rs = null;
        try {
            List<CampoAbstrato> modificados = getModificados(entidade);
            String sql = GeradorSql.insere(getNomeEntidade(), modificados);
            st = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            setParametros(st, 1, entidade, modificados);
            st.executeUpdate();
            rs = st.getGeneratedKeys();
            if(rs.next()) {
                int n = rs.getInt(1);
                chaves.get(0).invocaSet(entidade, n);
            }
        } catch(SQLException e) {
            throw ConexaoBD.novaExcecao(e);
        } finally {
            ConexaoBD.fecha(rs);
            ConexaoBD.fecha(st);
            fecha(con);
        }
    }


}
